<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>旧类</title>
    <script>
        /* 
            早在JS中，直接通过函数来定义类

                一个函数如果直接调用xxx(),那么这个函数就是一个普通函数
                一个函数如果通过new调用，newxxx()，那么这个函数就是一个构造函数
        
        */

//这样的方法太分散，通常会放在一个立即执行函数里(外层是立即执行函数，里层是构造函数)

    var Pserson=(function(){

        function Person(a,b){       // 构造函数
            this.name=a 
            this.age=b
       }

        //向原型中添加（属性）方法
        Person.prototype.sayHello=function(){
            return console.log(this.name)
        }
        // 添加静态属性
        Person.staticProperty='xxx'
        // 添加静态方法
        Person.staticMethod=function(){
            console.log('静态方法')
        }
        return Person    //  放到立即执行函数里，然后返回一个Person,之后定义一个变量接收一下
    
    }())

    const per = new Pserson('张三',27)
    console.log(per)





//  继承
    var Animal=(function(){             //外面是立即执行函数，里面是构造函数
            function Animal(name,age){
                this.name=name
                this.age=age
            }
            return Animal
        })()

    var Cat=(function (){
        function Cat(name,age,gender,address){
           Animal.call(this,name,age)   //调用了父类Animal的构造函数来初始化从父类继承的属性
            this.gender=gender;
            this.address=address;

        }

        //继承Animal类
        Cat.prototype = new Animal();
        Cat.prototype.constructor = Cat;    // 将Cat类的原型对象的constructor属性设置回Cat类自身

        return Cat
    })()

        //创建cat对象
        var animal1=new Animal('朱丽叶',"2")
        var cat=new Cat('罗密欧',"28",'男',"江苏南京")
        
        console.log(animal1)
        console.log(cat)



        console.log(cat instanceof Cat)
        console.log(cat instanceof Animal)







  


    </script>
</head>
<body>
    
</body>
</html>